//package com.lsq.tucao.login.shiro.realm;
//
//import com.lsq.tucao.login.pojo.RoleDetail;
//import com.lsq.tucao.login.pojo.UserDetail;
//import com.lsq.tucao.login.pojo.po.Permission;
//import com.lsq.tucao.login.pojo.po.User;
//import com.lsq.tucao.login.service.UserService;
//import org.apache.shiro.authc.*;
//import org.apache.shiro.authz.AuthorizationInfo;
//import org.apache.shiro.authz.SimpleAuthorizationInfo;
//import org.apache.shiro.realm.AuthorizingRealm;
//import org.apache.shiro.subject.PrincipalCollection;
//import org.springframework.beans.factory.annotation.Autowired;
//
//
///**
// * shiro 的 Realm类
// */
//public class CustomRealm extends AuthorizingRealm {
//
//    @Autowired
//    private UserService userService;
//
//    //授权
//    @Override
//    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//
//        String username = (String) principalCollection.getPrimaryPrincipal();
//        UserDetail userDetail = (UserDetail) userService.getUserDetailByName(username).getData();
//
//        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//        for (RoleDetail roleDetail : userDetail.getRoleDetail()) {
//            info.addRole(roleDetail.getRole().getRoleName());
//            for (Permission permission : roleDetail.getPermission()) {
//                info.addStringPermission(permission.getPermissionName());
//            }
//        }
//
//        return info;
//    }
//
//
//    //认证
//    @Override
//    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//
//        if (token.getPrincipal() == null) {
//            return null;
//        }
//
//        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
//        String name = usernamePasswordToken.getUsername();
//
//        User user = (User) userService.getUserByName(name).getData();
//        if (null == user) {
//            //用户名不存在
//            //我们只需要return null即可，Shiro底层判断为null则抛出UnKnowAccountException异常
//            return null;
//        } else {
//            //返回数据库保存的密码给Shiro，让Shiro判断密码是否正确
//            /**
//             * Shiro底层获取SimpleAuthenticationInfo的参数，例如获取password判断和用户输入的密码是否一致
//             *    1）如果密码不一致，抛出IncorrectCredentialsException异常
//             *    2）如果密码一致， 把principal存入session域
//             */
//
//            //SimpleAuthenticationInfo： 封装认证数据对象
//            /**
//             * 参数一： principal  登录用户对象，用于Subject.getPrincipal()方法获取；也可以传用户名
//             * 参数二： password   数据库的密码
//             * 参数三： realm的别名， 在多个Realm的情况下使用，用于区分用户表的。只有一张用户表不需要别名
//             */
//            return new SimpleAuthenticationInfo(name, user.getPassword(), getName());
//        }
//
//    }
//
//}
